package com.itheima.demo_16_Lambda方法引用;

import com.itheima.demo_12_Stream_map转换泛型流.Student;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;

/**
 * lambda引用构造方法
 * 格式: 类名::new
 * 如以下代码中:map方法需要一个Function,则有集中方式可以完成
 *
 * 方式1:调用map方法时,传入Function匿名内部类
 * 方式2:调用map方法时,传入lambda表达式,关注方法逻辑,实现方法逻辑
 * 方式3:调用map方法时,注意到Function中的apply的逻辑,就是调用Student类的构造方法
 *       则将传入Function子类对象直接改为传入Student的构造方法即可,即代码48行
 */
public class Demo04 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("迪丽热巴");
        list.add("宋远桥");
        list.add("苏星河");
        list.add("老子");
        list.add("庄子");
        list.add("孙子");
        list.add("洪七公");

        //使用stream流，对集合中的数据，进行打印
        //list.stream().forEach(s -> System.out.println(s));
        list.stream().forEach(System.out::println);

        //将字符串集合，转成Student对象的集合，并打印数据
        Stream<Student> studentStream = list.stream().map(new Function<String, Student>() {
            @Override
            public Student apply(String s) {
                return new Student(s);
            }
        });
        studentStream.forEach(student -> System.out.println("当前student对象是"+student));
        System.out.println("===============================================================");

         //构造方法的lambda引用
        Stream<Student> studentStream2 = list.stream().map(Student::new);
        studentStream2.forEach(student -> System.out.println("当前student对象是："+student.getName()));

        System.out.println("====================================================");
        //最简单操作
        list.stream()
                .map(Student::new)
                .forEach(System.out::println);
    }

}
